import { _decorator, Component, Node, UITransform, Sprite, Animation, SpriteFrame, AnimationClip, animation } from 'cc'

// utils
import { sortSpriteFrames } from '../Utils'

// 状态机
import { StateMchine } from './StateMchine'

export const ANIMATION_SPEED = 1 / 8 //1秒有8帧

// 加载图片资源
import RescourceManager from '../Runtime/RescourceManager'

// 1.需要知道animationClip
// 2.需要播放动画的能力animation
export default class State {
  // 状态机
  private fsm: StateMchine

  // 资源的路径
  private _path: string

  // 动画的循环模式
  private _wrapMode: AnimationClip.WrapMode

  // 动画事件
  events: any[] = []

  // 动画剪辑
  animationClip: AnimationClip | null = null

  constructor(
    stateMachine: StateMchine,
    path: string,
    wrapMode: AnimationClip.WrapMode = AnimationClip.WrapMode.Normal, //默认是Normal，只播放一次
    events: any[] = []
  ) {
    this.fsm = stateMachine
    this._path = path
    this._wrapMode = wrapMode
    this.events = events || []
    // 初始化
    this.init()
  }

  async init() {
    // 先等加载资源
    const spriteFramePromise = RescourceManager.Instance.loadDir(this._path, SpriteFrame)

    this.fsm.waitingList.push(spriteFramePromise)

    let spriteFrames = await spriteFramePromise
    // 对资源进行排序，可能获取的是9，8，10，通过下面的排序，会变成8，9，10
    spriteFrames = sortSpriteFrames(spriteFrames)

    // 创建动画
    const animationClip = new AnimationClip()

    const track = new animation.ObjectTrack() // 创建一个向量轨道
    track.path = new animation.TrackPath().toComponent(Sprite).toProperty('spriteFrame') // 指定轨道路径，即指定目标对象为 "Foo" 子节点的 "position" 属性

    const frames = spriteFrames.map((spriteFrame: SpriteFrame, index: number) => {
      return [index * ANIMATION_SPEED, spriteFrame] as [number, SpriteFrame]
    })
    track.channel.curve.assignSorted(frames)
    // track.channel.curve.assignSorted([ // 为 x 通道的曲线添加关键帧
    //     [0.4, ({ value: 0.4 })],
    //     [0.6, ({ value: 0.6 })],
    //     [0.8, ({ value: 0.8 })],
    // ]);

    // 最后将轨道添加到动画剪辑以应用
    animationClip.addTrack(track)

    // 整个动画剪辑的周期
    animationClip.duration = frames.length * ANIMATION_SPEED

    // 设置动画循环
    animationClip.wrapMode = this._wrapMode

    // 设置name
    animationClip.name = this._path

    // 设置帧事件
    animationClip.events = this.events


    this.animationClip = animationClip
  }

  run() {
    if(this.fsm.animationComponent?.defaultClip?.name === this.animationClip?.name) {
      return
    }

    // 设置动画
    this.fsm.animationComponent.defaultClip = this.animationClip
    this.fsm.animationComponent.play() //开始播放
  }
}
